September 10, 2020
cra로 리액트 프로젝트를 시작하는 것은 정말 편하다. 리액트가 알아서 복잡한 바벨과 웹팩 환경을 세팅해주므로 개발자는 리액트 코드만 작성하면 알아서 자동 빌드해주고 서버까지 띄워주기 때문이다.
하지만 eject를 해서 웹팩 설정을 수정해야하는 순간 cra가 얼마나 많은 것들을 감추고 있었는지 깨닫게 되고, 내가 ‘다 차려진 밥상 위에 숟가락만 얹히고’ 있었다는 것을 깨닫게 된다.
따라서 이 포스팅을 통해서 직접 리액트 프로젝트 세팅을 해봄으로써 바벨과 웹팩, 그리고 덤으로(?) ESLint의 사용법을 간단하게 정리하여 리액트에 대한 이해를 더 넓혀보고자 한다.
먼저 npm init을 이용하여 package.json 파일을 생성한다.
npm init리액트를 사용하기 위해 react와 react-dom 모듈과, react-hot-loader를 설치해준다.
npm i react react-dom
npm i -D react-hot-loader.
+-- public
| +--index.html
+-- src
| +--index.js
| +--App.js
| +--App.csspublic 폴더에는 모든 static assets을 넣을 것이다.
public / index.html 파일을 아래와 같이 작성해준다.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Bolierplate</title>
</head>
<body>
<div id="root"></div>
<script src="../dist/bundle.js"></script>
<!--번들링된 js 파일과 연결해준다-->
</body>
</html>import React from 'react'
import ReactDOM from 'react-dom'
import App from './App.js'
ReactDOM.render(<App />, document.getElementById('root'))src / App.js 파일을 아래와 같이 작성해준다.
import React, { Component } from 'react'
import { hot } from 'react-hot-loader'
import './App.css'
class App extends Component {
render() {
return (
<div className="App">
<h1>Hello World!</h1>
</div>
)
}
}
export default hot(module)(App)바벨을 패키지 및 모듈을 설치한다.
npm i -D @babel/core @babel/preset-env @babel/preset-react{
"presets": ["@babel/env", "@babel/preset-react"]
}자 이렇게 바벨까지 다 세팅해주었다면 웹팩을 설치 및 설정하여 js 코드를 빌드 해주어야 한다.
모듈 번들러이다.웹팩 설정을 위해 필요한 모듈을 설치해준다.
npm i -D webpack webpack-cli webpack-dev-server웹팩에서 사용할 loader 모듈들을 설치해준다.
npm i -D style-loader css-loader babel-loaderconst path = require('path')
const webpack = require('webpack')
module.exports = {
mode: 'development', // 배포시에는 production으로 변경해야한다.
devtool: 'eval',
resolve: {
// 웹팩이 알아서 경로 / 확장자를 처리할 수 있게 도와주는 옵션
extensions: ['.js', '.jsx'],
},
entry: './src/index.js', // 웹팩이 읽어들일 파일
module: {
// js 모듈의 변환을 rules에 맞게 처리해준다.
rules: [
{
test: /\.(js|jsx)$/,
exclude: /(node_modules|bower_components)/,
loader: 'babel-loader',
options: {
presets: ['@babel/preset-env', '@babel/preset-react'],
plugins: 'react-hot-loader/babel',
},
},
{
test: /\.css$/,
use: ['style-loader', 'css-loader'],
},
],
},
output: {
// 번들링된 js 파일이 저장될 위치와 파일명
path: path.join(__dirname, 'dist/'),
publicPath: '/dist/',
filename: 'bundle.js',
},
devServer: {
contentBase: path.join(__dirname, 'public/'),
port: 3000,
publicPath: 'http://localhost:3000/dist/',
hotOnly: true,
},
plugins: [new webpack.HotModuleReplacementPlugin()],
}mode
resolve
entry
module
rules 에서 test와 exclude 옵션
output
output의 publicPath
devServer
contentBase
devServer의 publicPath
핫 로더 적용
npm i -D eslint eslint-plugin-react프로젝트의 최상위 루트에 .eslintrc 라는 ESLint 설정 파일을 생성해주고 아래와 같이 설정해준다.
{
"env": {
"browser": true,
"node":true,
"es6": true
},
"plugins": ["react"],
"extends": [
"eslint:recommended",
"plugin:react/recommended"
],
"parserOptions": {
"ecmaVersion": 7,
"sourceType": "module",
"ecmaFeatures": {
"jsx": true
}
}
}.
+-- dist
| +-- bundle.js
+-- public
| +-- index.html
+-- src
| +-- App.css
| +-- App.js
| +-- index.js
+-- .babelrc
+-- .eslintrc
+-- .gitignore
+-- package.json
+-- package-lock.json
+-- webpack.config.js이렇게 웹팩과 바벨 그리고 ESLint를 사용하여 나만의 리액트 bolierpalte를 만들어보았다. 만들면서 든 생각은 웹팩 설정이 참 까다롭긴해도 , 이렇게 한번 알아두면 나중에 CRA에서 eject로 수정할 때에도, 혹은 커스텀하여 리액트 프로젝트 세팅을 할 때에도 편하다는 것이다.